For implicit grabs, we grab the *event* window, not the pointer window
authorAlexander Larsson <alexl@redhat.com>
Mon, 15 Dec 2008 13:26:10 +0000 (14:26 +0100)
committerAlexander Larsson <alex@localhost.localdomain>
Thu, 2 Apr 2009 08:15:15 +0000 (10:15 +0200)
gdk/gdkwindow.c

index 9bfc8c7cfd18bffbffb3dd035e1abae4cca11e36..a823e035f7c99a29e53d3eadcd61a125976cc5db 100644 (file)
@@ -7386,6 +7386,7 @@ proxy_button_event (GdkEvent *source_event)
   GdkEventType type;
   gdouble toplevel_x, toplevel_y;
   GdkDisplay *display;
+  GdkWindowObject *w;
 
   type = source_event->any.type;
   toplevel_window = source_event->any.window;
@@ -7403,6 +7404,17 @@ proxy_button_event (GdkEvent *source_event)
        _gdk_window_find_descendant_at (toplevel_window,
                                        toplevel_x, toplevel_y,
                                        NULL, NULL);
+
+      /* Find the actual event window, its what gets the grab */
+      w = (GdkWindowObject *)pointer_window;
+      while (w != NULL && w->parent->window_type != GDK_WINDOW_ROOT)
+       {
+         if (w->event_mask & GDK_BUTTON_PRESS_MASK)
+           break;
+         w = w->parent;
+       }
+      pointer_window = w;
+      
       
       if (pointer_window != NULL &&
          pointer_window != source_event->any.window)